package py.una.pol.ii.is2.dao.flota;

/**
 * Clase que implementa la interfaz InsumoDAO
 * @author mbenitez
 * @date 30/04/2009
 */
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import py.una.pol.ii.is2.domain.flota.DetallePlantillaMantenimiento;
import py.una.pol.ii.is2.domain.flota.PlantillaMantenimiento;
import py.una.pol.ii.is2.domain.flota.Tipo;
import py.una.pol.ii.is2.domain.flota.Vehiculo;

@Stateless
public class PlantillaMantenimientoDAOBean implements PlantillaMantenimientoDAO {
    /**
     * Manejador de instancias de entidades para recuperar instancias desde
     * el Persistence Context
     */
    @PersistenceContext
    private EntityManager em;

    /**
     * Inserta una entidad de PlantillaMantenimiento en la base de datos.
     *
     * @param objeto Elemento a insertar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean insert(PlantillaMantenimiento objeto) throws Exception {
        boolean retorno = false;
        try {
            em.persist(objeto);
            retorno = true;
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Actualiza una entidad de PlantillaMantenimiento, recibida como parámetro,
     * en la base de datos. 
     *
     * @param objeto Elemento a editar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean update(PlantillaMantenimiento objeto) throws Exception {
        boolean retorno = false;
        try {
            em.merge(objeto);
            retorno = true;
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Elimina una entidad de PlantillaMantenimiento, recibida como parámetro,
     * en la base de datos. 
     *
     * @param objeto Elemento a eliminar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean delete(PlantillaMantenimiento objeto) throws Exception {
        boolean retorno = false;
        try {
            PlantillaMantenimiento mgdObjeto = em.merge(objeto);
            em.remove(mgdObjeto);
            retorno = true;
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Busca un registro de la tabla PlantillaMantenimiento por el código de la misma.
     * Utiliza el NamedQuery <b>PlantillaMantenimiento.findByPlmaCod</b> para su efecto.
     *
     * @param codObjeto Código de PlantillaMantenimiento buscada
     * @return retorno PlantillaMantenimiento encontrada, en otro caso null.
     * @throws java.lang.Exception
     */
    public PlantillaMantenimiento find(Integer codObjeto) throws Exception {
        PlantillaMantenimiento retorno = null;
        try {
            Query q = em.createNamedQuery("PlantillaMantenimiento.findByPlmaCod");
            q.setParameter("plmaCod", codObjeto);
            retorno = (PlantillaMantenimiento) q.getSingleResult();
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Devuelve todas las PlantillaMantenimientos en caso de que el parámetro condicion
     * sea o bien <b>null</b> o <b>vacio</b>, y aquellas que coincidan con la condicion
     * comenzando con la palabra clave <b>where</b>.
     * Las entidades son devueltas ordenadas por la clave primaria.
     *
     * @param condicion Restricción para la selección de resultados
     * @return retorno Lista de resultados arrojados por la ejecución de la consulta, en otro caso null.
     * @throws java.lang.Exception
     */
    public List<PlantillaMantenimiento> getListaPlantillaMantenimientos(String condicion) throws Exception {
        List<PlantillaMantenimiento> retorno = null;
        Query q = null;
        try {
            if (condicion == null || condicion.length() == 0) {
                q = em.createNamedQuery("PlantillaMantenimiento.findAll");
            } else {
                q = em.createQuery("select pm from PlantillaMantenimiento pm " + condicion + " order by pm.plmaCod");
            }
            // recuperamos la lista
            retorno = q.getResultList();
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Sincroniza la entidad de PlantillaMantenimiento con el correspondiente
     * registro de la base de datos, asi como todos sus detalles.
     * @param objeto Elemento a sincronizar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean refreshPlantilla(PlantillaMantenimiento objeto) throws Exception {
        boolean retorno = false;
        try {
            PlantillaMantenimiento mgdObjeto = em.merge(objeto);
            em.refresh(mgdObjeto);
            DetallePlantillaMantenimiento mgdDetalle;
            for (DetallePlantillaMantenimiento detalle : objeto.getDetallePlantillaMantenimientoCollection()) {
                mgdDetalle = em.merge(detalle);
                em.refresh(mgdDetalle);
            }
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Devuelve la lista de plantillas de mantenimiento asociadas al tipo
     * de vehiculo tipoVehiculo.
     *
     * @param tipoVehiculo Tipo de vehiculo
     * @return Lista de entidades, en otro caso null.
     * @throws java.lang.Exception
     */
    public List<PlantillaMantenimiento> getListaPlantillaMantenimientosByTipoVhiculo(Tipo tipoVehiculo) throws Exception {
        List<PlantillaMantenimiento> retorno = null;
        Query q = null;
        try {
            q = em.createQuery("select pm from PlantillaMantenimiento pm where pm.plmaCodTipoVehiculo = :codTipoVehiculo");
            q.setParameter("codTipoVehiculo", tipoVehiculo);
            // recuperamos la lista
            retorno = q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Devuelve todas las PlantillaMantenimientos que coincidan con el tipo del
     * vehiculo recibido como parametro, pero que no esten asignadas al mismo.
     *
     * @param vehiculo Vehiculo
     * @return Lista de entidades, en otro caso null.
     * @throws java.lang.Exception
     */
    public List<PlantillaMantenimiento> getListaPlantillaMantenimientosDiscriminadasByVehiculo(Vehiculo vehiculo) throws Exception {
        List<PlantillaMantenimiento> retorno = null;
        Query q = null;
        try {

                q = em.createQuery("select pm from PlantillaMantenimiento pm where pm.plmaCodTipoVehiculo = :tipo and pm.plmaCod not in (SELECT v.vehiculoPlantillaPK.veplPlantilla FROM VehiculoPlantilla v WHERE v.vehiculoPlantillaPK.veplVehiculo = :veplVehiculo)");
                q.setParameter("tipo", vehiculo.getVehiCodTipo());
                q.setParameter("veplVehiculo", vehiculo.getVehiCod());
                retorno = q.getResultList();
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }
}
